package es.gesfutbol.web;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.criterion.Order;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import es.gesfutbol.dao.IPartitDeQuinielaDao;
import es.gesfutbol.dao.IQuinielaDao;
import es.gesfutbol.dao.IUtilsDao;
import es.gesfutbol.domini.implementacio.PartitDeQuiniela;
import es.gesfutbol.domini.implementacio.Quiniela;
import es.gesfutbol.util.PosicioQuinielaComparator;

public class QuinielaController extends MultiActionController{

	private static final String TEMPORADA = "temporada";

	private IQuinielaDao quinielaDao;
		
	private IUtilsDao utilsDao;
	
	private IPartitDeQuinielaDao partitDeQuinielaDao;
	
	public IQuinielaDao getQuinielaDao(){
		return quinielaDao;
	}
	
	public void setQuinielaDao(IQuinielaDao quinielaDao){
		this.quinielaDao = quinielaDao;
	}
	
	public IUtilsDao getUtilsDao() {
		return utilsDao;
	}

	public void setUtilsDao(IUtilsDao utilsDao) {
		this.utilsDao = utilsDao;
	}
	
	public IPartitDeQuinielaDao getPartitDeQuinielaDao() {
		return partitDeQuinielaDao;
	}

	public void setPartitDeQuinielaDao(IPartitDeQuinielaDao partitDeQuinielaDao) {
		this.partitDeQuinielaDao = partitDeQuinielaDao;
	}

	public ModelAndView init(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

				List<Quiniela> quinieles = quinielaDao.findAll( Order.asc("numJornadaQuiniela") );
				
				Quiniela novaQuiniela = new Quiniela();
				
				String temporada = utilsDao.findById("temporada").getValor();
						
				ModelMap modelMap = new ModelMap();
				modelMap.addAttribute("temporada", temporada);
				modelMap.addAttribute("llistatQuinieles", quinieles);
				modelMap.put("quiniela", novaQuiniela);
				return new ModelAndView("administracion/quinieles", modelMap);
	}
	
	public ModelAndView viewUpdate(HttpServletRequest request,
			HttpServletResponse response){
		
		List<Quiniela> quinieles = quinielaDao.findAll();
		
		Long idQuiniela = Long.parseLong(request.getParameter("idQuiniela"));
		Quiniela quiniela = quinielaDao.findById(idQuiniela);
		
		ModelMap model = new ModelMap();
		model.addAttribute("llistatQuinieles", quinieles);
		model.put("quiniela", quiniela);
		return new ModelAndView("administracion/quinieles", model);
	}
	
	public ModelAndView addOrUpdate(HttpServletRequest request,
			HttpServletResponse response, Quiniela quiniela){
		
		quinielaDao.save(quiniela);
		
		return new ModelAndView("redirect:init.htm");
	}
	
	public ModelAndView initResultatsAnteriors(HttpServletRequest request,
			HttpServletResponse response){
		
		String temporada = utilsDao.findById("temporada").getValor();
		//LLista de quinieles.
		List<Quiniela> quinieles = quinielaDao.findByTemporada(temporada);

		Quiniela quiniela = null;
		List<PartitDeQuiniela> partitsDeQuiniela = null;
		for(Quiniela q : quinieles){
			if(q.isEstaActiu()){
				quiniela = quinielaDao.deproxy(q);
				Set<PartitDeQuiniela> partits = quiniela.getPartits();
				partitsDeQuiniela = new ArrayList<PartitDeQuiniela>(partits);
				partitsDeQuiniela = partitDeQuinielaDao.deproxylist(partitsDeQuiniela);
				Collections.sort(partitsDeQuiniela, new PosicioQuinielaComparator());
				break;
			}
		}		

		ModelMap model = new ModelMap();
		model.addAttribute("llistatQuinieles", quinieles);
		model.put("quinielaActiva", quiniela);
		model.put("llistatPartitsDeQuiniela", partitsDeQuiniela);
		return new ModelAndView("gesfutbol/historic_quiniela", model);
	}

	public ModelAndView mostrarHistorics (HttpServletRequest request, HttpServletResponse response){
		
		Long idQuinielaAMostrar = Long.valueOf(request.getParameter("idQuiniela"));
		String temporada = utilsDao.findById(TEMPORADA).getValor();
		
		//LLista de jornades.
		List<Quiniela> quinieles = quinielaDao.findByTemporada(temporada);
		Quiniela quiniela = null;
		List<PartitDeQuiniela> partitsDeQuiniela = null;
		
		for(int i=0;i<quinieles.size(); i++){
			if(quinieles.get(i).getIdQuiniela().equals(idQuinielaAMostrar)){
				quinieles.get(i).setEstaActiu(true);
				quiniela = quinieles.get(i);
			}else{
				quinieles.get(i).setEstaActiu(false);
			}
		}

		quiniela = quinielaDao.deproxy(quiniela);
		Set<PartitDeQuiniela> partits = quiniela.getPartits();
		partitsDeQuiniela = new ArrayList<PartitDeQuiniela>(partits);
		partitsDeQuiniela = partitDeQuinielaDao.deproxylist(partitsDeQuiniela);
		Collections.sort(partitsDeQuiniela, new PosicioQuinielaComparator());

		ModelMap model = new ModelMap();
		model.addAttribute("llistatQuinieles", quinieles);
		model.put("quinielaActiva", quiniela);
		model.put("llistatPartitsDeQuiniela", partitsDeQuiniela);
		return new ModelAndView("gesfutbol/historic_quiniela", model);
	}	
}